package analizadorCadena;

import gramaticaPrecedencia.GramaticaSerializable;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import simbolo.Simbolo;
import simbolo.Terminal;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/*
 *@args
 *		0 archivo .xml
 *		1 archivo .txt con las cadenas para analizar(una en cada linea).
 * 
 */
public class AnalizadorMain {

	public static void main(String[] args) throws IOException {
		
		//En args[0] se espera el path pasado por parametro
		String pathTabla= args[0];
		GramaticaSerializable gramatica= null;
		XStream xStream = new XStream(new DomDriver());
		System.out.println(args[0]);
		
		FileReader tablaFileR= null;
        StringBuffer tablaXML=new StringBuffer();
        try  {
           tablaFileR=new FileReader(pathTabla);
           int c;
           while((c=tablaFileR.read())!=-1){
               tablaXML.append((char)c);
           }
      }catch (IOException ex) {
    	  System.out.println("Error al leer el archivo pasado por parametro");
      }
		//Tomo la gramatica del archivo en pathTabla.
      	//System.out.println(tablaXML.toString());
		gramatica = (GramaticaSerializable)xStream.fromXML(tablaXML.toString());
		System.out.println("El archivo se ha cargado correctamente...");
		Analizador analizador = new Analizador(gramatica.getTabla(),gramatica.getProducciones(), gramatica.getSimboloInicial().getCaracter());
		
		// Intento abrir el archivo con las cadenas.
		BufferedReader cadenas=null;
		String cadena=null;
		Character simboloInvalido;
		try{
			cadenas = new BufferedReader(new FileReader(args[1]));
			
	        while ((cadena = cadenas.readLine()) != null) {
	        	
	        	if (cadena.charAt(0) != '#'){
	        		System.out.println("La cadena es: "+cadena);
	        		simboloInvalido = chequeoSimbolosValidos(cadena,gramatica.getTerminales());
	        		if(simboloInvalido!=null){
	        			System.out.println("La cadena contiene simbolos invalidos.");
	        			System.out.println("Simbolos invalido: " + simboloInvalido);
	        		}else {
	        			analizador.cadenaValida(cadena);
					}
	        		}else{
	        			cadena = cadena.subSequence(1, cadena.length()).toString();
	        			System.out.println("Comentario: "+cadena);
	        		}
	        	
	            }
	    }catch(IOException ioe){
			ioe.getStackTrace();
		}finally{
			if(cadena==null){
				cadenas.close();
			}
		}
	}
	
	private static Character chequeoSimbolosValidos(String cadena, ArrayList<Terminal> simbolos){
		int i = 0;
		Character simbolo;
		Character simboloInvalido = null;
		while(i<cadena.length()){
			simbolo = cadena.charAt(i);
			if(!simbolos.contains(new Terminal(simbolo))){
					simboloInvalido = simbolo;
			}
			i++;
		}
		return simboloInvalido;
	}
}
